import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
//使用插件
Vue.use(VueRouter);

// 引入store
import store from '@/store'

//把人家原型对象的push方法进行保存
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//VueRouter.prototype原型对象添加一个方法
//location:路由跳转相关的信息
VueRouter.prototype.push = function (location, resolve, reject) {
    //当前函数this：即为VueRouter类的实例
    //相当于push方法里面this，是windows【完犊子了】
    //利用人家push方法实现路由跳转，保证push里面this,应该vueRouter类的实例

    //面试:函数apply与call区别?
    //相同的地方:都可以篡改函数里面this
    //不同的地方:apply传递参数 数组  call传递参数 逗号分割

    if (resolve && reject) {
        //代表真:代表着两个形参接受参数【箭头函数】
        originPush.call(this, location, resolve, reject);
    } else {
        originPush.call(this, location, () => { }, () => { });
    }
}


VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve && reject) {
        //代表真:代表着两个形参接受参数【箭头函数】
        originReplace.call(this, location, resolve, reject);
    } else {
        originReplace.call(this, location, () => { }, () => { });
    }
}
//配置路由
let router = new VueRouter({
    routes,
    // 滚动行为
    scrollBehavior(to, from, savedPosition) {
        // y:0代表滚动条回到页面最上方
        return { y: 0 };
    },
})

// 全局前置守卫(在路由跳转之间进行判断)
router.beforeEach(async (to, from, next) => {
    //to:可以获取跳转到哪的路由信息
    //from:可以获取从哪来的路由信息
    //next:放行函数 next()放行 next(path)放行到指定路径 

    // 获取仓库里的token
    let token = store.state.user.token;
    // 获取仓库里的用户信息
    let name = store.state.user.userInfo.name;
    // 如果用户已经登录了
    if (token) {
        // 如果跳转到login页面
        if (to.path == "/login" || to.path == "/register") {
            // 路由跳转到login页面,守卫到首页
            next('/home')
        } else {
            //登录了但是去的不是login页面,(/search,/shopcart/....)放行
            // 如果用户名已有
            if (name) {
                next();
            } else {
                // 如果没有用户名，即用户信息,就派发获取仓库里的用户信息
                try {
                    //获取用户信息成功
                    await store.dispatch("getUserInfo");
                    // 放行
                    next();
                } catch (error) {
                    // token失效获取不到登录信息,重新登录
                    // 清除token,去登录
                    await store.dispatch('userLogout');
                    next('/login')
                }
            }
        }
    } else {
        // 未登录:不能去交易相关,不能去支付相关,不能去个人中心
        // 未登录去上面网站->去登录页面
        let toPath = to.path;
        if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
            // 把未登录时候想去的地址存储到地址栏中
            next('/login?redirect=' + toPath)
        } else {
            // 去掉不是上述网站,放行
            next();
        }
    }
})

export default router;